home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
tools
/
sharp
/
sxwork2.lzh
/
サンプル基礎編
/
図形表示
/
FIGURE.C
next >
Wrap
Text File
|
1994-03-10
|
13KB
|
352 lines
/******************************************************************************
* figure.c: 図形の表示
******************************************************************************
* Workroom SX-68K Sample Program Copyright 1994 SHARP
*
* 機能説明:
* このプログラムは、ウィンドウを作成し、アップデートイベントで図形を表示
* します。
* 表示する図形は、SXシステムで用意されている長方形、楕円、円弧、面取り
* 長方形の4種類でそれぞれ枠だけの描画と、中を塗りつぶしたものを描画しま
* す。
*/
#include <ctype.h>
#include <stdlib.h>
#include <event.h> /* イベントマンを利用するときに必要 */
#include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
#include <window.h> /* ウィンドウマンを利用するときに必要 */
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "figure.h" /* このプログラム固有のヘッダファイル */
char _sxkernelcomm[] = SXKERNEL; /* カーネル起動コマンド */
/******************************************************************************
* main(): メイン関数
******************************************************************************
*/
int main(void)
{
ComVal cv; /* 共通変数 */
if (!init(&cv)) { /* 初期化処理を行う */
showErrDialog(&cv); /* エラーダイアログを表示する */
cv.endFlag = TRUE; /* 終了フラグをセットする */
}
/* 終了フラグがセットされるまでループする */
while (!cv.endFlag) {
cv.errorCode = 0; /* エラーコードをクリアする */
/* タスクマンからイベントを取得する */
TSEventAvail(cv.eventMask, &cv.event);
/* 各イベントに対応した処理を行う */
switch (cv.event.ts.what) {
case E_MSLDOWN: /* マウスレフトダウンイベント */
msLDownEvent(&cv);
break;
case E_KEYDOWN: /* キーダウンイベント */
keyDownEvent(&cv);
break;
case E_UPDATE: /* アップデートイベント */
updateEvent(&cv);
break;
case E_ACTIVATE: /* アクティベートイベント */
activateEvent(&cv);
break;
case E_SYSTEM1: /* システムイベント */
case E_SYSTEM2:
systemEvent(&cv);
break;
}
if (cv.errorCode != 0) /* エラーが発生したか? */
showErrDialog(&cv); /* エラーダイアログを表示する */
}
/* 終了手続きを行う */
endProc(((cv.errorCode == 0) ? EXIT_SUCCESS : EXIT_FAILURE), &cv);
return 0;
}
/******************************************************************************
* init(): 初期化処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 初期化成功
* = FALSE: 初期化失敗(終了)
* 注釈: 共通変数の初期化、アボート処理関数の登録、ウィンドウの作成と
* 表示などを行う。
*/
BOOLEAN init(ComVal *pcv)
{
pcv->windowPtr = NULL; /* ウィンドウポインタ */
pcv->activeFlag = FALSE; /* アクティブフラグ */
pcv->eventMask = EVENTMASK; /* イベントマスク */
pcv->errorCode = 0; /* エラーコード */
pcv->endFlag = FALSE; /* 終了フラグ */
TSSetAbort(endProc, (long) pcv); /* アボート処理関数を登録する */
if (LOWWORD(SXVer()) < SXVER2) { /* SXシステムのバージョンを調べる */
pcv->errorCode = 1; /* バージョン2より古い */
return FALSE; /* 失敗したのでFALSEを返す */
}
if (!createWindow(pcv)) { /* ウィンドウを作成する */
pcv->errorCode = 2; /* 作成できなかった */
return FALSE; /* 失敗したのでFALSEを返す */
}
GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
GMForeColor(G_BLACK); /* フォアグラウンドカラーを黒にする */
/* バックグラウンドカラーをライトグレーにする */
GMBackColor(G_LGRAY);
/* このサンプルでは、図形の描画にカラーを使用するので、アクセスページを
0~2ページにする */
GMAPage(G_PAGE0 | G_PAGE1 | G_PAGE2);
WMShow(pcv->windowPtr); /* ウィンドウを表示する */
return TRUE; /* 成功したのでTRUEを返す */
}
/******************************************************************************
* createWindow(): ウィンドウの作成
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 作成成功
* = FALSE: 作成失敗(終了)
*/
BOOLEAN createWindow(ComVal *pcv)
{
int paramFlags; /* パラメータの有無 */
Rect rc;
Task task; /* タスク管理レコード */
static Rect winSize = { 0, 0, WIN_H, WIN_V }; /* ウィンドウサイズ */
TSGetTdb(&task, TS_OWN); /* タスク管理レコードを取得する */
paramFlags = TSTakeParam( /* コマンドラインを解析する */
task.command, /* コマンドライン */
&rc, /* 指定されたウィンドウ位置 */
NULL, /* 最終文字列を格納しない */
0, /* アドレステーブルを保存しない */
NULL, /* アドレステーブルを作成しない */
NULL); /* ポインタを確保しない */
if (!(paramFlags & 1)) { /* ウィンドウ位置の指定があるか? */
/* ない場合、システムからウィンドウの左上座標を取得する */
rc = winSize;
GMSlideRect(&rc, TSGetWindowPos());
}
pcv->windowPtr = WMOpen( /* ウィンドウをオープンする */
NULL, /* ウィンドウポインタを確保する */
&rc, /* ウィンドウの表示位置 */
WINTITLE, /* ウィンドウタイトル */
FALSE, /* オープン時に描画しない */
WI_STD2 << 4, /* タイトルの広い標準ウィンドウ */
W_FRONT, /* 一番手前に表示する */
TRUE, /* クローズボタンを使用する */
TSGetID()); /* 自分のタスクID */
if (pcv->windowPtr == NULL)
return FALSE; /* 失敗したのでFALSEを返す */
return TRUE; /* 成功したのでTRUEを返す */
}
/******************************************************************************
* msLDownEvent(): マウスレフトダウンイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈:
* ウィンドウ上でマウスの左ボタンが押された場合の処理を行う。
* この処理でクローズボタンによる終了、ウィンドウの移動が可能となります。
*/
void msLDownEvent(ComVal *pcv)
{
int partCode; /* ウィンドウのパートコード */
Window *wTemp; /* テンポラリウィンドウポインタ */
/* イベントが自分のウィンドウか? */
if (pcv->event.ev.whom.win == pcv->windowPtr) {
/* ウィンドウがインアクティブで、OPT.1キーが押されてないか? */
if (!pcv->activeFlag && !(pcv->event.ev.how & KS_OPT1)) {
/* ウィンドウをアクティブにする */
WMSelect(pcv->windowPtr);
/* ボタンが押された場所のパートコードを取得する */
partCode = WMFind(pcv->event.ev.where.x_y, &wTemp);
/* タイトルバー以外か、左ボタンが離されたか? */
if (partCode != W_INDRAG || !EMLStill())
return;
}
/* マウスのボタンが押されている間、ウィンドウ上の各種処理を
システムに任せて、ボタンが押された、または離された場所の
パートコードを取得する */
partCode = SXCallWindM(pcv->windowPtr, &pcv->event);
if (partCode == W_INCLOSE) /* クローズボタンか? */
pcv->endFlag = TRUE; /* 終了フラグをセットする */
}
}
/******************************************************************************
* keyDownEvent(): キーダウンイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈: OPT.1+'Q'キーでの終了処理を行う。
*/
void keyDownEvent(ComVal *pcv)
{
int shortCut; /* ショートカットキー */
if (pcv->event.ev.how & KS_OPT1) { /* OPT.1キーが押されたか? */
/* キー入力した文字を大文字に変換する */
shortCut = toupper((int) pcv->event.ev.whom.key.ascii);
if (shortCut == 'Q') /* 終了か? */
pcv->endFlag = TRUE; /* 終了フラグをセットする */
}
}
/******************************************************************************
* updateEvent(): アップデート処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈:
* アップデート処理としてウィンドウ内部を描画する。
* この処理を行わないと、自分より下のウィンドウのアップデートやアイドル
* イベントの処理ができなくなります。
*/
void updateEvent(ComVal *pcv)
{
/* イベントが自分のウィンドウか? */
if (pcv->event.ev.whom.win == pcv->windowPtr) {
WMUpdate(pcv->windowPtr); /* アップデートを開始する */
drawGraph(pcv); /* ウィンドウ内部を描画する */
WMUpdtOver(pcv->windowPtr); /* アップデートを終了する */
}
}
/******************************************************************************
* drawGraph(): ウィンドウ内部の描画
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void drawGraph(ComVal *pcv)
{
int lastFC;
static Rect fgrPos[] = { /* 図形の表示位置 */
{ FRM1_X, FRM1_Y, FRM1_X + 50, FRM1_Y + 50 }, /* 長方形 */
{ FLL1_X, FLL1_Y, FLL1_X + 50, FLL1_Y + 50 },
{ FRM2_X, FRM2_Y, FRM2_X + 50, FRM2_Y + 40 }, /* 楕円 */
{ FLL2_X, FLL2_Y, FLL2_X + 50, FLL2_Y + 40 },
{ FLL3_X, FLL3_Y, FLL3_X + 50, FLL3_Y + 50 }, /* 円弧 */
{ FRM3_X, FRM3_Y, FRM3_X + 50, FRM3_Y + 50 },
{ FLL4_X, FLL4_Y, FLL4_X + 50, FLL4_Y + 50 }, /* 面取り長方形 */
{ FRM4_X, FRM4_Y, FRM4_X + 50, FRM4_Y + 50 }
};
GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
lastFC = GMForeColor(G_RED); /* フォアグラウンドカラーを赤にする */
GMFrameRect(&fgrPos[0]); /* 第1の長方形は枠だけ描く */
GMFillRect(&fgrPos[1]); /* 第2の長方形は塗りつぶしで描く */
GMForeColor(G_GREEN); /* フォアグラウンドカラーを緑にする */
GMFrameOval(&fgrPos[2]); /* 第1の楕円は枠だけ描く */
GMFillOval(&fgrPos[3]); /* 第2の楕円は塗りつぶしで描く */
GMForeColor(G_BLUE); /* フォアグラウンドカラーを青にする */
GMFillArc(&fgrPos[4], 90, 0); /* 第1の円弧は塗りつぶしで描く */
GMFrameArc(&fgrPos[5], 0, 270); /* 第2の円弧は枠だけ描く */
GMForeColor(G_YELLOW); /* フォアグラウンドカラーを黄色にする */
/* 第1の円弧は塗りつぶしで描く */
GMFillRRect(&fgrPos[6], LONGWORD(10, 10));
GMFrameRRect(&fgrPos[7], LONGWORD(10, 10)); /* 第2の楕円は枠だけ描く */
GMForeColor(lastFC); /* フォアグラウンドカラーを元に戻す */
}
/******************************************************************************
* activateEvent(): アクティベートイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈: アクティブ、インアクティブによるアクティブフラグの切り替えと、
* イベントマスクの切り替えを行う。
*/
void activateEvent(ComVal *pcv)
{
/* イベントが自分のウィンドウか? */
if (pcv->event.ev.whom.win == pcv->windowPtr) {
pcv->activeFlag = TRUE; /* アクティブフラグをセットする */
/* アクティブ時のイベントマスクをセットする */
pcv->eventMask = EVENTMASK | EM_KEYDOWN;
/* イベントが他のウィンドウで、自分がアクティブ状態か? */
} else if (pcv->activeFlag) {
pcv->activeFlag = FALSE; /* アクティブフラグをクリアする */
/* インアクティブ時のイベントマスクをセットする */
pcv->eventMask = EVENTMASK;
}
}
/******************************************************************************
* systemEvent(): システムイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈: 全ウィンドウのクローズ、全タスクの終了、ウィンドウのセレクトに
* 対応した処理を行う。
*/
void systemEvent(ComVal *pcv)
{
switch (pcv->event.ts.what2) { /* イベントの種類は? */
case CLOSEALL: /* 全ウィンドウのクローズ */
case ENDTSK: /* 全タスクの終了 */
pcv->endFlag = TRUE; /* 終了フラグをセットする */
break;
case WINDOWSELECT: /* ウィンドウのセレクト */
WMSelect(pcv->windowPtr); /* ウィンドウをアクティブにする */
break;
}
}
/******************************************************************************
* showErrDialog(): エラーダイアログの表示
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void showErrDialog(ComVal *pcv)
{
int i;
static struct { /* エラー情報 */
int code; /* エラーコード */
int manager; /* 使用するマネージャ */
int flag; /* 表示フラッグ */
char *message; /* エラーメッセージ */
} errInfo[] = {
{ 1, 1, D_RED, "SX SYSTEMのバージョンが違います。" },
{ 2, 2, D_RED, "ウィンドウが作成できません。" },
{ 0, 1, D_YELLOW, "エラーが発生しました。" }
};
for (i = 0; errInfo[i].code != 0; i++) /* エラーコードを捜す */
if (errInfo[i].code == pcv->errorCode)
break;
switch (errInfo[i].manager) { /* マネージャの選択 */
case 1: /* ダイアログマン */
DMError(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
break;
case 2: /* タスクマン */
TSErrDialogN(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
break;
}
}
/******************************************************************************
* endProc(): 終了手続き
******************************************************************************
* 引数: int code 終了コード
* ComVal *pcv 共通変数へのポインタ
* 注釈: ハンドルの解放やウィンドウの廃棄と、プログラムの終了を行う。
*/
void endProc(int code, ComVal *pcv)
{
/* ウィンドウポインタが確保されたままか? */
if (pcv->windowPtr != NULL)
WMDispose(pcv->windowPtr); /* ウィンドウを廃棄する */
exit(code); /* プログラムを終了する */
}